#pragma once
#ifndef __GRAPHICSRENDER_PREDECLARE_H__
#define __GRAPHICSRENDER_PREDECLARE_H__

#include <memory>
#include <unordered_map>

namespace WindGE
{
	//render
	class RenderDevice;
	typedef std::shared_ptr<RenderDevice> RenderDevicePtr;

	class RenderContext;
	typedef std::shared_ptr<RenderContext> RenderContextPtr;

	class RenderSwapChain;
	typedef std::shared_ptr<RenderSwapChain> RenderSwapChainPtr;

	class RenderView;
	typedef std::shared_ptr<RenderView> RenderViewPtr;

	class RenderTargetView;
	typedef std::shared_ptr<RenderTargetView> RenderTargetViewPtr;

	class DepthStencilView;
	typedef std::shared_ptr<DepthStencilView> DepthStencilViewPtr;

	class Texture;
	typedef std::shared_ptr<Texture> TexturePtr;

	class Texture2D;
	typedef std::shared_ptr<Texture2D> Texture2DPtr;

	class VertexBuffer;
	typedef std::shared_ptr<VertexBuffer> VertexBufferPtr;

	class VertexBufferPart;
	typedef std::shared_ptr<VertexBufferPart> VertexBufferPartPtr;

	class GraphicsBuffer;
	typedef std::shared_ptr<GraphicsBuffer> GraphicsBufferPtr;

	//shader	
	class ShaderBind;
	typedef std::shared_ptr<ShaderBind> ShaderBindPtr;

	class ConstantBuffer;
	typedef std::shared_ptr<ConstantBuffer> ConstantBufferPtr;

	class VertexInputLayout;
	typedef std::shared_ptr<VertexInputLayout> VertexInputlayoutPtr;

	class ShaderObject;
	class VertexShader;
	class GeometryShader;
	class HullShader;
	class DomainShader;
	class PixelShader;
	typedef std::shared_ptr<ShaderObject> ShaderObjectPtr;
	typedef std::shared_ptr<VertexShader> VertexShaderPtr;
	typedef std::shared_ptr<GeometryShader> GeometryShaderPtr;
	typedef std::shared_ptr<HullShader> HullShaderPtr;
	typedef std::shared_ptr<DomainShader> DomainShaderPtr;
	typedef std::shared_ptr<PixelShader> PixelShaderPtr;
	
	class ShaderProgram;
	typedef std::shared_ptr<ShaderProgram> ShaderProgramPtr;
	typedef std::weak_ptr<ShaderProgram> ShaderProgramPtr_Weak;

	class ShaderVariable;
	typedef std::shared_ptr<ShaderVariable> ShaderVariablePtr;

	class ConstantBufferData;
	typedef std::shared_ptr<ConstantBufferData> ConstantBufferDataPtr;

	class TextureResource;
	typedef std::shared_ptr<TextureResource> TextureResourcePtr;

	class TextureSampler;
	typedef std::shared_ptr<TextureSampler> TextureSamplerPtr;

	class ShaderViewTarget;
	typedef std::shared_ptr<ShaderViewTarget> ShaderViewTargetPtr;

	//app
	class Application;
	typedef std::shared_ptr<Application> ApplicationPtr;

	class Timer;
	typedef std::shared_ptr<Timer> TimerPtr;

	//mesh
	class VertexStream;
	typedef std::shared_ptr<VertexStream> VertexStreamPtr;
	typedef std::unordered_map<std::string, VertexStreamPtr> VertexStreamMapping;
	typedef std::pair<std::string, VertexStreamPtr> VertexStreamPair;

	class MeshPart;
	typedef std::shared_ptr<MeshPart> MeshPartPtr;

	class Mesh;
	typedef std::shared_ptr<Mesh> MeshPtr;

	//game
	class Component;
	typedef std::shared_ptr<Component> ComponentPtr;

	class GameObject;
	typedef std::shared_ptr<GameObject> GameObjectPtr;
	typedef std::weak_ptr<GameObject>	GameObjectPtr_Weak;

	class Transform;
	typedef std::shared_ptr<Transform> TransformPtr;

	class RenderMgr;
	typedef std::shared_ptr<RenderMgr> RenderMgrPtr;

	class SceneMgr;
	typedef std::shared_ptr<SceneMgr> SceneMgrPtr;

	class Win32Window;
	typedef std::shared_ptr<Win32Window> Win32WindowPtr;

	//Util
	class Cube;
	typedef std::shared_ptr<Cube> CubePtr;

	class Plane;
	typedef std::shared_ptr<Plane> PlanePtr;

	class Frustum;
	typedef std::shared_ptr<Frustum> FrustumPtr;

	#pragma comment(lib, "Utility.lib")

}//end namespace WinGE

#endif	//__GRAPHICSRENDER_PREDECLARE_H__
